/*
 * Copyright (C) 2016 yixun All Rights Reserved.
 * 
 * CustomerService.java
 */
package com.emm.yixun.basic.service;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.emm.yixun.common.enums.SalesReportDto;
import com.emm.yixun.common.model.Customer;
import com.emm.yixun.common.model.Project;
import com.emm.yixun.common.model.appDto.AuditListDto;
import com.emm.yixun.common.model.appDto.CustomerCountDto;
import com.emm.yixun.common.model.dto.ClientDataParams;
import com.emm.yixun.common.model.dto.ContactWayDto;
import com.emm.yixun.common.model.dto.CustomerComponentDto;
import com.emm.yixun.common.model.dto.CustomerDto;
import com.emm.yixun.common.model.pmo.ClientData;
import com.emm.yixun.common.page.Page;

/**
 * [文件名称]<br>
 * CustomerService.java<br>
 * <br>
 * [文件描述]<br>
 * 客户信息表 service interface<br>
 * <br>
 * [修改记录]<br>
 * 2016-05-11 11:27:13 创建 陶俊代码生成器<br>
 * 
 * @author 陶俊代码生成器
 * @version 1.00
 */
public interface CustomerService {
	/**
	 * @param entity
	 *            搜索条件
	 * @param begin
	 *            分页开始行数[不包含]
	 * @param end
	 *            分页结束行数[包含]
	 * @return 分页记录
	 */
	public Page<Customer> getPageModel(CustomerDto entity, int begin, int end);

	/**
	 * 查询列表
	 * 
	 * @param entity
	 *            搜索条件
	 * @return 分页记录
	 */
	public List<Customer> selectListByDto(CustomerDto entity);

	/**
	 * 查询单个
	 * 
	 * @param entity
	 *            搜索条件
	 * @return 分页记录
	 */
	public Customer selectByDto(CustomerDto entity);

	/**
	 * @param id
	 *            根据主键搜索
	 * @return 一行记录
	 */
	public Customer selectById(Long id);

	/**
	 * @param entity
	 *            新增记录的详细信息
	 * @return 新增行数
	 */
	public CustomerDto create(CustomerDto entity);

	/**
	 * @param entity
	 *            更新记录的详细信息
	 * @return 更新行数
	 */
	public CustomerDto update(CustomerDto entity);

	/**
	 * @param entity
	 *            待删除的记录信息
	 * @return 删除行数
	 */
	public int destroy(CustomerDto entity);

	/**
	 * @param entity
	 *            新增或更新
	 * @return 新增行数
	 */
	public int saveOrUpdate(CustomerDto entity);

	/**
	 * @param entity
	 *            搜索条件
	 * @param begin
	 *            分页开始行数[不包含]
	 * @param end
	 *            分页结束行数[包含]
	 * @return 分页记录
	 */
	public Page<Customer> getCustomerList(CustomerDto entity, int begin, int end);

	/**
	 * app 查询未完善客户信息列表
	 * @param entity
	 * @param begin
	 * @param end
	 * @return
	 */
	Page<Customer> getImperfectCustomerList(CustomerCountDto entity, int begin, int end);

	/**
	 * @param entity
	 *            搜索条件
	 * @param begin
	 *            分页开始行数[不包含]
	 * @param end
	 *            分页结束行数[包含]
	 * @return 分页记录
	 */
	public Page<Customer> getSubscribeCustomerList(CustomerCountDto entity, int begin, int end);

	/**
	 * @param entity
	 *            搜索条件
	 * @param begin
	 *            分页开始行数[不包含]
	 * @param end
	 *            分页结束行数[包含]
	 * @return 分页记录
	 */
	public Page<Customer> getPaymentCustomerList(CustomerCountDto entity, int begin, int end);

	/**
	 * 查询列表,根据姓名、电话进行模糊查询
	 * 
	 * @param entity
	 *            搜索条件
	 * @return 分页记录
	 */
	public List<Customer> getCustomerByFuzzyQuery(CustomerDto entity);

	/**
	 * @param entity
	 *            搜索条件
	 * @param begin
	 *            分页开始行数[不包含]
	 * @param end
	 *            分页结束行数[包含]
	 * @return 分页记录
	 */
	public Page<AuditListDto> getAuditEntityList(CustomerCountDto entity, int begin, int end);

	/**
	 * @param entity
	 *            搜索条件
	 * @param begin
	 *            分页开始行数[不包含]
	 * @param end
	 *            分页结束行数[包含]
	 * @return 分页记录
	 */
	public Page<Customer> getCustomerCountList(CustomerCountDto entity, int begin, int end);

	// 客户选择组件
	public Page<CustomerComponentDto> selectCustomerComponentPage(CustomerComponentDto entity, int begin, int end);

	public Page<CustomerComponentDto> selectCustomerPage(CustomerComponentDto entity, int begin, int end);
	
	public List<CustomerComponentDto> selectCustomerAll(CustomerComponentDto entity);

	public List<Project> selectCustomerProject(CustomerComponentDto entity);

	/**
	 * 客户交易状态更新（多套交易）
	 * 
	 * @param bugType
	 *            业务类型： 1 认筹、2 认购、3 签约
	 * @param busId
	 *            对应业务类型Id
	 * @param customerId
	 *            客户Id
	 * @param userId
	 *            用户Id
	 * @return
	 */
	public int getCustomerEntity(String bugType, Long busId, Long customerId, Long userId);

	// 通过客户列表tab参数拼接条件语句
	public String createTabTypeSql(String tabType, Long merchantId);

	/**
	 * 查询列表
	 * 
	 * @param entity
	 *            搜索条件
	 * @return 分页记录
	 */
	public List<Customer> selectCustomerPhoneByListPC(CustomerDto entity);

	/**
	 * 根据姓名或手机号查询客户
	 * 
	 * @param entity
	 * @param begin
	 * @param end
	 * @return
	 */
	public Page<CustomerComponentDto> findCustomerPageByNameOrPhone(CustomerComponentDto entity, int begin, int end);

	public Integer cusCount(CustomerComponentDto entity);

	/**
	 * 根据销售组用户更新客户信息 功能描述: <br>
	 * 〈功能详细描述〉
	 * 
	 * @param entity
	 * @return
	 * @see [相关类/方法](可选)
	 * @since [产品/模块版本](可选)
	 */
	public int updateBySaleGroupUser(CustomerDto entity);
	
	/**
	 * 跟进客户ID查询客户业务状态
	 * 
	 * @param id
	 * @return 业务状态
	 */
	public String queryCustomerBusiness(Long id);
	
	/**
	 * 查询列表
	 * 
	 * @param entity
	 *            搜索条件
	 * @return 分页记录
	 */
	public List<CustomerDto> setBirthByDto(CustomerDto entity);

	/**
	 * 查询 意向等级与用户信息不相符的用户数
	 * @param dto
	 * @return
	 */
	int findIntentionIntactCount(CustomerComponentDto dto);

	/**
	 * 分页查询 意向等级与用户信息不相符的用户
	 * @param entity
	 * @param begin
	 * @param end
	 * @return
	 */
	Page<CustomerComponentDto> selectCustomerItentionPage(CustomerComponentDto entity, int begin, int end);
	
	/**
	 * 
	 * queryProjectFtContactWay:绿城微信OA报表. <br/>
	 *
	 * @author Administrator
	 * @param contactWayDto
	 * @return
	 * @since JDK 1.6
	 */
	public List<ContactWayDto> queryProjectFtContactWay(ContactWayDto contactWayDto);
	
	/**
	 * 
	 * queryCustomerLevel:(客户等级报表). <br/>
	 *
	 * @author Administrator
	 * @return
	 * @since JDK 1.6
	 */
	public HashMap<String, Long> queryCustomerLevel(ContactWayDto contactWayDto);

	/**
	 * 查询单个
	 * 
	 * @param entity
	 *            搜索条件
	 * @return 分页记录
	 */
	public Customer getSubjectRatio(CustomerDto entity);

	/**
	 * 
	 * queryProjectSignedInfo:微信销售报表. <br/>
	 *
	 * @author Administrator
	 * @return
	 * @since JDK 1.6
	 */
	public List<SalesReportDto> queryProjectSignedInfo(ContactWayDto contactWayDto);
	
	
	public List<SalesReportDto> queryProjectSignedInfoByIds(ContactWayDto contactWayDto);
	
	/**
	 * 项目某个时间段增加的客户
	 * @param clientDataParams
	 * @return
	 */
	public List<ClientData> queryCustomerLevelByPmo(ClientDataParams clientDataParams);

	/**
	 * 校验客户登记
	 * 1、是否存在交易
	 * 2、是否信息完善
	 * @param customerId
	 * @return
	 */
	public boolean checkCustomerLevel(Long customerId);

	/**
	 * 校验客户信息是否完善
	 * @param customerId
	 * @return
	 */
	public boolean checkCustomerPerfect(Long customerId);

	/**
	 * 变更客户等级
	 * @param customerId
	 * @return
	 */
	boolean changeCustomerLevel(Long customerId, String level);

}
